package eva.savant.business.ventas.service.util;

public class Algoritmo {
	
		
	private static char[] invertirCadena(String cadena) {
    	
    	String cadenaInvertida= "";
    	
    	for (int i=cadena.length()-1; i>=0; i--)

    	cadenaInvertida = cadenaInvertida + cadena.charAt(i);
    	
    	return cadenaInvertida.toCharArray();
    }

	
	private static String convierteAHexadecimal(int numero) {
		
		String cad= Integer.toHexString(numero);

		return cad.length()==1? "0"+cad : cad;
	}
	
	
	public static String cifrarMensajeRC4(String mensaje, String key) {
		
		String  mensajeCifrado="";

		
		int state[]= new int[256];			
		int x=0,  y= 0; 
		int index1 = 0; 
		int index2 = 0;
		int NMen   =-1;
		
		
		for(int i=0; i<state.length; i++)
		state[i]= i;
		
		
		for(int i=0; i<state.length; i++) {
						
			index2= (((int)key.charAt(index1))+state[i]+index2) % 256;
		             			
			int    temp  = state[  i   ];
			state[  i   ]= state[index2]; 
			state[index2]= temp;
			
			index1= (index1+1) % key.length();			
		}
		
		
		for(int i=0; i<mensaje.length(); i++) {
			
			x= (    x+1   ) % 256;
			y= (state[x]+y) % 256;
			
		    int temp= state[x];
            state[x]= state[y]; 
            state[y]= temp;
			
			NMen= ((int)mensaje.charAt(i)) ^ state[ (state[x]+state[y]) % 256 ]; 
			mensajeCifrado= mensajeCifrado+"-" + convierteAHexadecimal(NMen);
		}
		
		
		mensajeCifrado= mensajeCifrado.substring(1,mensajeCifrado.length());
		
				
		return mensajeCifrado.toUpperCase(); 
	}

	    		
	public static int obtenerVerhoeff(String cifra) {
		
		
    	int    Mul[][] = { {0,1,2,3,4,5,6,7,8,9}, 
        	               {1,2,3,4,0,6,7,8,9,5}, 
            	           {2,3,4,0,1,7,8,9,5,6}, 
                	       {3,4,0,1,2,8,9,5,6,7}, 
                    	   {4,0,1,2,3,9,5,6,7,8}, 
                       	   {5,9,8,7,6,0,4,3,2,1}, 
                           {6,5,9,8,7,1,0,4,3,2}, 
                           {7,6,5,9,8,2,1,0,4,3}, 
                           {8,7,6,5,9,3,2,1,0,4}, 
                           {9,8,7,6,5,4,3,2,1,0} };
 
		int    Per[][] = { {0,1,2,3,4,5,6,7,8,9}, 
           		           {1,5,7,6,2,8,3,0,9,4}, 
                		   {5,8,0,3,7,9,6,1,4,2}, 
                           {8,9,1,6,0,4,3,5,2,7}, 
                           {9,4,5,3,1,2,6,8,7,0}, 
                           {4,2,8,6,5,7,3,9,0,1}, 
                           {2,7,9,3,8,0,6,4,1,5}, 
                           {7,0,4,6,9,1,3,2,5,8} };
                                
		int Inv[] = {0,4,3,2,1,5,6,7,8,9} , Check = 0;
		
            	
        char NumeroInvertido[] = invertirCadena(cifra);
  
  		
  		
  		
  		for( int i= 0; i<NumeroInvertido.length; i++)

  	    Check = Mul[Check][ Per[((i + 1) % 8)][Integer.valueOf(NumeroInvertido[i]+"")] ];
  
  
  		return Inv[Check];  		
	}
	
	
    public static String obtenerBase64(int numero) { 
    
    	char Dicionario[]= {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
                            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 
                            'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 
                            'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 
                            'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 
                            'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 
                            'y', 'z', '+', '/' }; 
    	
    	int Cociente = 1, Resto;
    	
    	String Palabra = ""; 
  
  
    	while (Cociente > 0) { 
  
    		Cociente = numero / 64; 
    		Resto =    numero % 64; 
   
    		Palabra = Dicionario[Resto] + Palabra;
  
            numero = Cociente; 
    	}
  
   return Palabra;   
   }
	
}